#ifndef __LIB_KERNEL_LIST_H
#define __LIB_KERNEL_LIST_H

#include "stdint.h"
#include "global.h"

#define offset(struct_type, member) ((uint32_t)(&((struct_type*)0)->member))
#define elem2entry(struct_type, struct_member_name, elem_ptr)   \
        (struct_type*)((uint32_t)elem_ptr - offset(struct_type, struct_member_name))

struct list_elem{
    struct list_elem* prev;
    struct list_elem* next;
};

struct list{
    struct list_elem head;
    struct list_elem tail;
};

/* 自定义函数类型function,用于在list_traversal中做回调函数 */
typedef bool (function)(struct list_elem*, int arg);

void list_insert_before(struct list_elem* l1, struct list_elem* l2);
void list_remove(struct list_elem* pelem);
void list_push(struct list* plist, struct list_elem* elem);
struct list_elem* list_pop(struct list* plist);
void list_append(struct list* plist, struct list_elem* elem);  
bool list_empty(struct list* plist);
uint32_t list_len(struct list* plist);
struct list_elem* list_traversal(struct list* plist, function func, int arg);
bool elem_find(struct list* plist, struct list_elem* obj_elem);
void list_init(struct list* l);

#endif